// 高阶函数的定义：
// 可以把函数作为参数传递给另一个函数    还可以把函数作为另一个函数的的返回值 
// 案例 实现forEach


// 作为参数的高阶函数

function forEach(arr,fn){
    for(let i=0;i<arr.length;i++){
        fn(arr[i])
    }
}
let arr=[1,1,2,3,4,5]

// forEach(arr,function(item){
//     console.log(item)
// })


function filter(array,fn){
    let results=[];
    for(let i=0;i<array.length;i++){
        if(fn(array[i])){
            results.push(array[i])
        }
    }
    return results
}
// let gl=filter(arr,function(item){
//     return item%2==0
// })
// console.log(gl);

function maps(array,fn){
    let results=[]
    for(let i=0;i<array.length;i++){
        results.push(fn(array[i]))
    }
    return results;
}

// let mapvalue=maps(arr,function(item){
//     return item
// })
// console.log(mapvalue)
//如果有一个不满足条件的话 就是false
const every=(array,fn)=>{
    let result=true;
    for(let value of array){
        result=fn(value);
        if(!result){
            break
        }
    }
    return result
}


// let arrE=[11,9,13]
// let r=every(arrE,v => v>10)
// console.log(r)


//如果有满足一个条件的话 就是true
const some=(array,fn)=>{
    let result =false
    for(let value of array){
        result=fn(value)
        if(result){
            break
        }
    }
    return result
}

let arrA=[10,20,30]
let somevalue=some(arrA,item=> item<3)
console.log(somevalue);

// 作为返回值的函数

// function makeFun(){
//     let msg='hello'
//     return function(){
//         console.log(msg)
//     }
// }
// let fn=makeFun()
// fn();

// //只调用一次函数
// function once(fn){
//     let done=false;
//     return function(){
//         if(!done){
//             done=true;
//             // console.log(this)
//             // console.log(arguments)
//             // return fn.call(this,[...arguments])
//             return fn.apply(this,arguments)
//         }
//     }
// }
// let pay=once(function(money,aa){
//     // console.log(`支付了${money} 钱`)
//     return money;
// });
// let a=pay(5,66)
// console.log(a)

